// 引入Node.js内置模块：fs（文件操作）、stream（流处理，需Transform转换流）
const fs = require('fs');
const { Transform } = require('stream');

// 1. 创建自定义转换流：将输入的字符转为大写
// Transform流是"可读可写流"，可在数据传输过程中修改数据
const upperCaseTransform = new Transform({
  // _transform方法：核心处理逻辑（chunk=当前数据块，encoding=编码，callback=回调）
  transform(chunk, encoding, callback) {
    // 将Buffer格式的chunk转为字符串，再转为大写
    const upperCaseData = chunk.toString().toUpperCase();
    // 将处理后的数据传递给下一个流（或写入目标）
    this.push(upperCaseData);
    // 通知流当前数据块处理完成
    callback();
  }
});

// 2. 创建可读流：读取from.txt文件（若文件不存在，会报错，需提前创建）
const readStream = fs.createReadStream('./from.txt', {
  encoding: 'utf8', // 指定编码为utf8，避免默认的Buffer格式
  highWaterMark: 64 // 每次读取的缓冲区大小（默认64KB，此处设小值便于测试）
});

// 3. 创建可写流：写入to.txt文件（若文件不存在则创建，存在则覆盖）
const writeStream = fs.createWriteStream('./to.txt', {
  encoding: 'utf8'
});

// 4. 管道连接：可读流 → 转换流 → 可写流（链式管道）
// pipe自动处理数据流动、背压（backpressure），避免内存溢出
readStream
  .pipe(upperCaseTransform) // 第一步：数据转大写
  .pipe(writeStream)        // 第二步：大写数据写入to.txt

// 5. 监听流事件，提示执行状态
// 可读流读取完成事件
readStream.on('end', () => {
  console.log('✅ from.txt 读取完成');
});

// 可写流写入完成事件
writeStream.on('finish', () => {
  console.log('✅ 数据已全部写入 to.txt（所有字符已转为大写）');
});

// 监听错误事件（捕获文件不存在、权限不足等错误）
readStream.on('error', (err) => {
  console.error('❌ 可读流错误：', err.message);
});

writeStream.on('error', (err) => {
  console.error('❌ 可写流错误：', err.message);
});

upperCaseTransform.on('error', (err) => {
  console.error('❌ 转换流错误：', err.message);
});